#include "bsp_keyfilter.h"
#include "bsp_beep.h"
#include "bsp_led.h"
#include "bsp_int.h"
#include "bsp_gpio.h"
#include "bsp_epittimer.h"

void keyfilter_init(void)
{
	/* GPIO1_IO18 */
	gpio_pin_config_t config;

	/* 1. 初始化IO复用，复用为GPIO1_IO18 */
	IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);

	/* 2. 设置 UART1_CTS_B IO 的电气特性 */
	IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xf080);

	/* 3. 初始化 GPIO1_IO18 设置为输入 */
	config.directioin = kGPIO_DigitalInput;
	config.intMode = kGPIO_FalllingEdgeInt;
	gpio_init(GPIO1, 18, &config);

	/* 启用GIC IRQ */
	GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);
	/* 注册IRQ处理函数 */
	system_irqhandler_register(GPIO1_Combined_16_31_IRQn, gpio1_16_31_irqhandler, NULL);

	/* EPIT1定时器初始化 */
	keyfilter_timer_init(66000000/100);

	/* 启用gpio中断 */
	gpio_int_enable(GPIO1, 18);
}

void keyfilter_timer_init(int value){
	EPIT1->CR = 0;
	EPIT1->CR = (1 << 24 )| (1 << 3) | (1 << 2) | (1 << 1);
	EPIT1->LR = value;
	EPIT1->CMPR = 0;

	/* 使能GIC EPIT1_IRQn 中断 */
	GIC_EnableIRQ(EPIT1_IRQn);
	/* 注册中断处理函数 */
	system_irqhandler_register(EPIT1_IRQn, keyfilter_timer_irqhandler, NULL);
}

void keyfilter_timer_stop(void)
{
	EPIT1->CR &= ~(1 << 0);
}

void keyfilter_timer_restart(int value){
	EPIT1->CR &= ~(1 << 0);		/* 关闭EPIT1 */
	EPIT1->LR = value;			/* EPIT1加载值寄存器 */
	EPIT1->CR |= (1 << 0);		/* 打开EPIT1 */
}

void keyfilter_timer_irqhandler(IRQn_Type irq, void *userparam){
	static int beep_state = 0;

	if(EPIT1->SR & (1 << 0)){					/* 检查EPIT1中断标志 */
		keyfilter_timer_stop();					/* 关闭EPIT1定时器 */
		if(gpio_pinread(GPIO1, 18) == 0)		/* 检查gpio引脚电平值 */
		{
			beep_state = !beep_state;			/* 翻转蜂鸣器 */
			beep_switch(beep_state);
		}
	}

	/* 清除中断标志位 */
	EPIT1->SR |= (1<<0);
}

void gpio1_16_31_irqhandler(IRQn_Type irq, void *userparam){
	if(GPIO1->ISR & (1 << 18)){
		keyfilter_timer_restart(66000000/100);		/* 重启EPIT1定时器，定时器周期10ms */
	}

	/* 清除中断标志位 */
	gpio_int_cleanFlag(GPIO1, 18);
}

